
package carmadness; //.model.helpers;

import java.util.*;

/**
 * Kétirányú hozzárendelést lehetővé tevő HashMap.
 * @author Szelei
 * @version 1.0
 * @created 10-Apr-2010 2:32:37 PM
 */
public class BijectiveHashMap<K, V> extends HashMap<K, V>
{
	private HashMap<V, K> reverse = new HashMap<V, K>();

	/**
	 * Elhelyez egy kulcs-érték párt a HashMap-ben. Ha a kulcshoz
	 * már létezett érték, akkor az le lesz cserélve. Ha az érték már
	 * el van tárolva egy másik kulccsal hivatkozva, akkor nem történik
	 * semmi.
	 *
	 * @param 
	 *			key A választott kulcs
	 *
	 * @param 
	 *			value A hozzárendelendő érték
	 *
	 * @return
	 *			A korábbi érték, ha volt ilyen kulccsal, vagy null 
	 *			egyébként. Akkor is null, ha az érték már szerepel a 
	 *			hozzárendelések között.
	 *
	 */
	@Override
	public V put(K key, V value)
	{
		if ( !containsValue(value) )
		{
			reverse.put(value, key);
			return super.put(key, value);
		}
		else
		{
			return null;
		}
	}

	/**
	 * Visszatér az értékhez tartozó kulccsal.
	 * @param 
	 *			value A keresett érték.
	 * @return 
	 *			Az értékhez tartozó kulcs, vagy null, ha nincs ilyen.
	 */
	public K reverseGet(V value)
	{
		return reverse.get(value);
	}

	/**
	 * Eltávolítja a kulcshoz tartozó értéket.
	 *
	 * @param 
	 *			key A keresendő kulcs.
	 *
	 * @return
	 *			A hozzárendelt érték vagy null, ha nem létezett hozzárendelés.
	 */
	@Override
	public V remove(Object key)
	{
		Set<java.util.Map.Entry<V, K>> pairs = reverse.entrySet();
		Map.Entry<V, K> value_key_pair = null;
		Iterator<Map.Entry<V, K>> itr = pairs.iterator();

		while ( itr.hasNext() )
		{
			value_key_pair = itr.next();

			if ( value_key_pair.getValue().equals(key) )
			{
				reverse.remove(value_key_pair.getKey());
				return super.remove(key);
			}
		}

		return null;
	}

	/**
	 * Törli az összes hozzárendelést.
	 */
	@Override
	public void clear()
	{
		reverse.clear();
		super.clear();
	}
}
